'use strict'
const path = require('path')

const envconfig = require('./env.config')

function resolve(dir) {
  return path.join(__dirname, dir)
}

const _port = 9527
const name = '管理后台'

const _publicPathMap = {
  development: '/',
  production: '/',
}

module.exports = {
  publicPath: _publicPathMap[process.env.NODE_ENV],
  outputDir: 'dist',
  assetsDir: 'static',
  lintOnSave: process.env.NODE_ENV === 'development',
  productionSourceMap: false,
  devServer: {
    port: _port,
    open: true,
    overlay: {
      warnings: false,
      errors: true,
    },
  },
  css: {
    loaderOptions: {
      less: {
        lessOptions: {
          javascriptEnabled: true,
        },
      },
      sass: {
        data: '$domain:"' + envconfig.imgUrl + '";',
      },
    },
  },
  configureWebpack: {
    name: name,
    resolve: {
      alias: {
        '@': resolve('src'),
      },
    },
  },
  chainWebpack(config) {
    config.plugins.delete('preload')
    config.plugins.delete('prefetch')

    if (process.env.NODE_ENV === 'production') {
      // 清除css，js版本号
      config.output.filename('static/js/[name].js').end()
      config.output.chunkFilename('static/js/[name].js').end()
      // 为生产环境修改配置...
      config.plugin('extract-css').tap((args) => [
        {
          filename: `static/css/[name].css`,
          chunkFilename: `static/css/[name].css`,
        },
      ])
    }

    const imagesRule = config.module.rule('images')
    imagesRule
      .use('url-loader')
      .loader('url-loader')
      .tap((options) => Object.assign(options, { limit: 6144 }))
      .end()

    // set preserveWhitespace
    config.module
      .rule('vue')
      .use('vue-loader')
      .loader('vue-loader')
      .tap((options) => {
        options.compilerOptions.preserveWhitespace = true
        return options
      })
      .end()

    // https://webpack.js.org/configuration/devtool/#development
    config.when(process.env.NODE_ENV === 'development', (config) =>
      config.devtool('cheap-source-map'),
    )

    config.when(process.env.NODE_ENV !== 'development', (config) => {
      config.optimization.splitChunks({
        chunks: 'all',
        cacheGroups: {
          libs: {
            name: 'chunk-libs',
            test: /[\\/]node_modules[\\/]/,
            priority: 10,
            chunks: 'initial', // only package third parties that are initially dependent
          },
          elementUI: {
            name: 'chunk-elementUI', // split elementUI into a single package
            priority: 20, // the weight needs to be larger than libs and app or it will be packaged into libs or app
            test: /[\\/]node_modules[\\/]_?element-ui(.*)/, // in order to adapt to cnpm
          },
          mdsUI: {
            name: 'chunk-mdsUI', // split mdsUI into a single package
            priority: 20, // the weight needs to be larger than libs and app or it will be packaged into libs or app
            test: /[\\/]node_modules[\\/]@bic-fe[\\/]_?mds-ui(.*)/, // in order to adapt to cnpm
          },
          commons: {
            name: 'chunk-commons',
            test: resolve('src/components'), // can customize your rules
            minChunks: 3, //  minimum common number
            priority: 5,
            reuseExistingChunk: true,
          },
        },
      })
      config.optimization.runtimeChunk('single')
    })
  },
  pluginOptions: {
    'style-resources-loader': {
      preProcessor: 'scss',
      patterns: [
        path.resolve(__dirname, 'src/styles/variables.scss'),
        path.resolve(__dirname, 'src/styles/mixins.scss'),
        path.resolve(__dirname, 'src/styles/element-ui.scss'),
        path.resolve(__dirname, 'src/styles/mds-ui.scss'),
      ],
    },
  },
}
